package controlador;

import hbt.CoeficienteSRV;
import hbt.ProveedorSRV;

import java.rmi.RemoteException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import Administrador.AdministradorCliente;
import Administrador.AdministradorComparativa;
import Administrador.AdministradorOC;
import Administrador.AdministradorProv;
import Administrador.AdministradorSolicitudCotizacion;
import Administrador.AdministradorStockRodamientos;
import ViewObjects.ClienteView;
import ViewObjects.ComparativaView;
import ViewObjects.ItemAlmacenView;
import ViewObjects.ItemLPView;
import ViewObjects.ListaPreciosView;
import ViewObjects.ProveedorView;
import ViewObjects.RemitoView;
import ViewObjects.RodamientoView;

//Del Common
import rmi.InterfazRemotaCPR;
import rmi.InterfazRemotaOF;

//Del Server
import rmi.ModeloRemoto;
import modelo.*;

public class Sistema extends ModeloRemoto implements InterfazRemotaCPR, InterfazRemotaOF {

	private static final long serialVersionUID = 1L;
	private Vector<Cliente> clientes;
	private Almacen almacen;
	private Vector<Rodamiento> rodamientos;
	private Vector<Comparativa> comparativas;
	private Vector<CondicionPago> condicionesPago;
	private EstrategiaDescuentoVenta politicaVenta;
	private static Sistema instancia;
	private Coeficiente coeficiente;
	
	public static Sistema getInstancia(){
		if (instancia==null){
			try {
				instancia = new Sistema();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} 
		return instancia;
	}	
	
	public Sistema() throws RemoteException {
		super();
		clientes = new Vector<Cliente>();
		almacen = new Almacen();
		rodamientos = new Vector<Rodamiento>();
		comparativas = new Vector<Comparativa>();
		condicionesPago = new Vector<CondicionPago>();
		politicaVenta = new EstrategiaDescuentoVenta();
		coeficiente = new CoeficienteSRV().consultarCoeficiente(1);
	}

	@Override
	public void alta_proveedor(int idProveedor, String razonSocial, String direccion, String telefono) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorProv apr = new AdministradorProv();
		apr.alta_proveedor(idProveedor, razonSocial, direccion, telefono);
	}

	@Override
	public void baja_proveedor(int idProveedor) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorProv apr = new AdministradorProv();
		apr.baja_proveedor(idProveedor);

	}

	@Override
	public void modificar_proveedor(int idProveedor, String razonSocial, String direccion, String telefono) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorProv apr = new AdministradorProv();
		apr.modificar_proveedor(idProveedor, razonSocial, direccion, telefono);
	}
	
	@Override
	public ProveedorView consultar_proveedor(int idProveedor) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorProv apr = new AdministradorProv();
		return apr.consultar_proveedor(idProveedor);
	}
	
	@Override
	public void modificar_coeficiente(float f) throws RemoteException {
		coeficiente.setValor(f);
		new CoeficienteSRV().modificarCoeficiente(coeficiente);
	}

	@Override
	public float consultar_coeficiente() throws RemoteException {
		// TODO Auto-generated method stub
		return coeficiente.getValor();
	}

	@Override
	public void alta_listaP(ListaPreciosView lp) throws RemoteException {
		// TODO Auto-generated method stub
		ListaPrecios lpre = new ListaPrecios();
		int idProveedor = lp.getIdProveedor();
		Proveedor p = new ProveedorSRV().consultarProveedor(idProveedor);
		if (p!=null){
			lpre.setIdLista(lp.getIdLista());
			lpre.setDescuentoLista(lp.getDescuentoLista());
			lpre.setFechaVigenciaDesde(lp.getFechaVigenciaDesde());
			lpre.setFechaVigenciaHasta(lp.getFechaVigenciaHasta());
			lpre.setVigente(true);
			Set<ItemLP> items = new HashSet<ItemLP>();
			
			for(Iterator it = lp.getItemslistaprecios().iterator(); it.hasNext(); ) { 
	        	ItemLPView itlv = (ItemLPView)it.next();
	        	ItemLP itl = new ItemLP();
	        	
	        	itl.setPorcDescuento(itlv.getPorcDescuento());
	        	itl.setPrecioUnit(itlv.getPrecioUnit());
	        	itl.setStockDisp(itlv.getStockDisp());
	        	
	        	Rodamiento r = new Rodamiento();
	        	r.setCodigoFabricante(itlv.getRodamiento().getCodigoFabricante());
	        	r.setCodigoSFK(itlv.getRodamiento().getCodigoSFK());
	        	r.setCaracteristica(itlv.getRodamiento().getCaracteristica());
	        	r.setMarca(itlv.getRodamiento().getMarca());
	        	r.setMedida(itlv.getRodamiento().getMedida());
	        	r.setPaisOrigen(itlv.getRodamiento().getPaisOrigen());
	        	r.setTipo(itlv.getRodamiento().getTipo());
	        	
	        	itl.setRodamiento(r);
	        	items.add(itl);
	        	
	        }
			lpre.setItemslistaprecios(items);
			p.agregarListaPrecios(lpre);

			//AdministradorProv apr = new AdministradorProv();
			//apr.agregar_ListaPrecio(p.getIdProveedor(),lpre);
			new ProveedorSRV().modificarProveedor(p);
			
			altaComparativa(p.getIdProveedor(),lpre);
		}

	}
	
	private void altaComparativa(int idproveedor, ListaPrecios lp){
		AdministradorComparativa admComp = new AdministradorComparativa();
		admComp.altaComparativa(idproveedor, lp);
	}
	
	@Override
	public List<ComparativaView> consCompCodigoFabricante(
			String codigoFabricante) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoFabricante(codigoFabricante);
	}

	@Override
	public List<ComparativaView> consCompCodigoFabricanteyMarca(
			String codigoFabricante, String marca) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoFabricanteyMarca(codigoFabricante, marca);
	}

	@Override
	public List<ComparativaView> consCompCodigoFabricanteyPaisOrigen(
			String codigoFabricante, String paisOrigen) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoFabricanteyPaisOrigen(codigoFabricante, paisOrigen);
	}

	@Override
	public List<ComparativaView> consCompCodigoSFK(String codigoSFK)
			throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoSFK(codigoSFK);
	}

	@Override
	public List<ComparativaView> consCompCodigoSFKyMarca(String codigoSFK,
			String marca) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoSFKyMarca(codigoSFK, marca);
	}

	@Override
	public List<ComparativaView> consCompCodigoSFKyPaisOrigen(
			String codigoSFK, String paisOrigen) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompCodigoSFKyPaisOrigen(codigoSFK, paisOrigen);
	}

	@Override
	public List<ComparativaView> consCompMarca(String marca)
			throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompMarca(marca);
	}

	@Override
	public List<ComparativaView> consCompPaisOrigen(String PaisOrigen)
			throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorComparativa admComp = new AdministradorComparativa();
		return admComp.consCompPaisOrigen(PaisOrigen);
	}
	
	/**
	 * @return the almacen
	 */
	public Almacen getAlmacen() {
		return almacen;
	}

	/**
	 * @param almacen the almacen to set
	 */
	public void setAlmacen(Almacen almacen) {
		this.almacen = almacen;
	}

	@Override
	public void ProcesarOC(int nroOC) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorStockRodamientos asr= new AdministradorStockRodamientos();
		asr.baja_stock(nroOC);
		
	}

	@Override
	public void alta_Stock(RemitoView re) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorStockRodamientos asr= new AdministradorStockRodamientos();
		asr.recepcion_Mercaderia(re);
		
	}

	@Override
	public ItemAlmacenView buscarItemAlmacen(String codigoSFK)
			throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorStockRodamientos asr= new AdministradorStockRodamientos();
		return asr.consultar_Stock(codigoSFK);
	}

	@Override
	public int buscarOc(int nroOC) throws RemoteException {
		// TODO Auto-generated method stub
		 AdministradorStockRodamientos asr= new AdministradorStockRodamientos();
		 return 0;
	}

	@Override
	public int consultar_stock(String rod) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorStockRodamientos asr= new AdministradorStockRodamientos();
	    return asr.consultar_stock(rod);
	}

	@Override
	public void modificar_stock(int codigo) throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int pruebaComparativa() throws RemoteException {
		// TODO Auto-generated method stub
		return 0;
	}
	

	
	@Override
	public void alta_cliente(int idCliente, String razonSocial, String direccion, String telefono) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorCliente apr = new AdministradorCliente();
		apr.alta_cliente(idCliente, razonSocial, direccion, telefono);
	}

	@Override
	public void baja_cliente(int idCliente) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorCliente apr = new AdministradorCliente();
		apr.baja_cliente(idCliente);

	}

	@Override
	public void modificar_cliente(int idCliente, String razonSocial, String direccion, String telefono) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorCliente apr = new AdministradorCliente();
		apr.modificar_cliente(idCliente, razonSocial, direccion, telefono);
	}
	
	@Override
	public ClienteView consultar_cliente(int idCliente) throws RemoteException {
		// TODO Auto-generated method stub
		AdministradorCliente apr = new AdministradorCliente();
		return apr.consultar_cliente(idCliente);
	}
	
	public void ProcesarSolicitudCotizacion(ClienteView vCliente, ArrayList<RodamientoView> vRodamientos)
	{
		AdministradorSolicitudCotizacion asc = new AdministradorSolicitudCotizacion();
		asc.ProcesarSolicitudCotizacion(vCliente, vRodamientos);
	}
	
}
